'''
函数：
'''

# 函数的位置参数
# 位置参数：调用函数时根据函数定义的参数位置来传递参数。
# 位置参数的特点：
# 1，调用函数时的实参个数必须和形参个数一致。
# 2，实参和形参的顺序必须一致。
# 3，实参和形参的类型必须一致。
# 4，实参和形参的个数必须一致。

def add(x,y):
    return x+y
print(add(1,2))

# 函数参数的默认值参数
# 默认值参数：调用函数时，如果没有传递参数，则会使用默认值。
# 默认值参数的特点：
# 1，调用函数时，如果没有传递参数，则会使用默认值。
# 3，默认值参数必须放在位置参数的后面。
# 4，默认值参数可以是任何类型。

def add(x,y=1):
    return x+y
print(add(1))

# 函数的关键字参数
# 关键字参数：调用函数时，通过“键=值”形式传递参数。
# 关键字参数的特点：
# 1，调用函数时，通过“键=值”形式传递参数。
# 2，关键字参数的顺序可以任意。
# 3，关键字参数必须放在位置参数的后面。
# 4，关键字参数可以是任何类型。
def add(x,y=1):
    return x+y
print(add(y=1,x=2))



# 函数的可变参数
# 可变参数：调用函数时，可以传递任意个参数。
# 可变参数的特点：
# 1，调用函数时，可以传递任意个参数。
# 2，可变参数必须放在位置参数的后面。
# 3，可变参数必须放在关键字参数的前面。

def add(*args):
    return args
print(add(1,2,3,4,5))



# 函数参数的解包
# 函数参数的解包：调用函数时，可以传递任意个参数。
# 函数参数的解包的特点：
# 1，调用函数时，可以传递任意个参数。
# 2，函数参数的解包必须放在位置参数的后面。
# 3，函数参数的解包必须放在关键字参数的前面。
def add(*args):
    return args
print(add(*[1,2,3,4,5]))


# 基于字典的参数
# 基于字典的参数：调用函数时，可以传递任意个参数。
# 基于字典的参数的特点：
# 1，调用函数时，可以传递任意个参数。
# 2，基于字典的参数必须放在位置参数的后面。
# 3，基于字典的参数必须放在关键字参数的前面。
def add(**kwargs):
    for k,v in kwargs.items():
        print(k,v)
    return kwargs
print(add(a=1,b=2,c=3))
print(add(**{'a':1,'b':2,'c':3})) # 基于字典的参数的解包，需要使用**符号，将字典解包成关键字参数。


def show(**kwargs):
    return f"{kwargs['a']},{kwargs['b']},{kwargs['c']}"
print(show(a=1,b=2,c=3))

# 函数的强制关键字参数
# 强制关键字参数：调用函数时，必须使用关键字参数。
# 强制关键字参数的特点：
# 1，调用函数时，必须使用关键字参数。
# 2，强制关键字参数必须放在位置参数的后面。
# 3，强制关键字参数必须放在可变参数的前面。
def add(*,x,y):
    return x+y
print(add(x=1,y=2))







